{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## PS1-2 Incomplete, Positive-Only Labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "#### (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Suppose that each $y^{(i)}$ and $x^{(i)}$ are conditionally independent given $t^{(i)}$, that is\n",
    "\n",
    "$$p(y^{(i)} = 1 \\ \\vert \\ t^{(i)} = 1, x^{(i)}) = p(y^{(i)} = 1 \\ \\vert \\ t^{(i)} = 1)$$\n",
    "\n",
    "Then\n",
    "\n",
    "\\begin{align*}\n",
    "p(y^{(i)} \\ \\vert \\ x^{(i)}) & = \\sum_{t^{(i)}} p(y^{(i)} = 1, t^{(i)} \\ \\vert \\ x^{(i)}) \\\\\n",
    "                             & = p(y^{(i)} = 1, t^{(i)} = 1 \\ \\vert \\ x^{(i)}) + p(y^{(i)} = 1, t^{(i)} = 0 \\ \\vert \\ x^{(i)}) \\\\\n",
    "                             & = p(y^{(i)} = 1, t^{(i)} = 1 \\ \\vert \\ x^{(i)}) + 0 \\\\\n",
    "                             & = p(y^{(i)} = 1 \\ \\vert \\ t^{(i)} = 1, x^{(i)}) \\ p(t^{(i)} = 1 \\ \\vert \\ x^{(i)}) \\\\\n",
    "                             & = p(y^{(i)} = 1 \\ \\vert \\ t^{(i)} = 1) \\ p(t^{(i)} = 1 \\ \\vert \\ x^{(i)}) \\\\\n",
    "                             & = \\alpha \\ p(t^{(i)} = 1 \\ \\vert \\ x^{(i)})\n",
    "\\end{align*}\n",
    "\n",
    "Therefore, $p(t^{(i)} = 1 \\ \\vert \\ x^{(i)}) = p(y^{(i)} \\ \\vert \\ x^{(i)}) / \\alpha$, where $\\alpha = p(y^{(i)} = 1 \\ \\vert \\ t^{(i)} = 1)$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "#### (b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "\\begin{align*}\n",
    "h(x^{(i)}) & \\approx p(y^{(i)} = 1 \\ \\vert \\ x^{(i)}) \\\\\n",
    "           & = \\alpha \\ p(t^{(i)} = 1 \\ \\vert \\ x^{(i)}) \\\\\n",
    "           & \\approx \\alpha \\cdot 1 \\\\\n",
    "           & = \\alpha\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "#### (c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import problem_set_1.src.util as util\n",
    "\n",
    "from problem_set_1.src.linear_model import LinearModel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "x_train, y_train = util.load_dataset('data/ds3_train.csv', add_intercept=True)\n",
    "_, t_train = util.load_dataset('data/ds3_train.csv', label_col='t')\n",
    "x_valid, y_valid = util.load_dataset('data/ds3_valid.csv', add_intercept=True)\n",
    "_, t_valid = util.load_dataset('data/ds3_valid.csv', label_col='t')\n",
    "x_test, y_test = util.load_dataset('data/ds3_test.csv', add_intercept=True)\n",
    "_, t_test = util.load_dataset('data/ds3_test.csv', label_col='t')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Reuse the logistic regression model in PS1-1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "class LogisticRegression(LinearModel):\n",
    "    \"\"\"Logistic regression with Newton's Method as the solver.\n",
    "\n",
    "    Example usage:\n",
    "        > clf = LogisticRegression()\n",
    "        > clf.fit(x_train, y_train)\n",
    "        > clf.predict(x_eval)\n",
    "    \"\"\"\n",
    "\n",
    "    def fit(self, x, y):\n",
    "        \"\"\"Run Newton's Method to minimize J(theta) for logistic regression.\n",
    "\n",
    "        :param x: Training example inputs. Shape (m, n).\n",
    "        :param y: Training example labels. Shape (m,).\n",
    "        \"\"\"\n",
    "\n",
    "        def h(theta, x):\n",
    "            \"\"\"Vectorized implementation of h_theta(x) = 1 / (1 + exp(-theta^T x)).\n",
    "\n",
    "            :param theta: Shape (n,).\n",
    "            :param x:     All training examples of shape (m, n).\n",
    "            :return:      The hypothesis for all training examples. Shape (m,).\n",
    "            \"\"\"\n",
    "            return 1 / (1 + np.exp(-np.dot(x, theta)))\n",
    "\n",
    "        def gradient(theta, x, y):\n",
    "            \"\"\"Vectorized implementation of the gradient of J(theta).\n",
    "\n",
    "            :param theta: Shape (n,).\n",
    "            :param x:     All training examples of shape (m, n).\n",
    "            :param y:     All labels of shape (m,).\n",
    "            :return:      The gradient of shape (n,).\n",
    "            \"\"\"\n",
    "            m, _ = x.shape\n",
    "            return -1 / m * np.dot(x.T, (y - h(theta, x)))\n",
    "\n",
    "        def hessian(theta, x):\n",
    "            \"\"\"Vectorized implementation of the Hessian of J(theta).\n",
    "\n",
    "            :param theta: Shape (n,).\n",
    "            :param x:     All training examples of shape (m, n).\n",
    "            :return:      The Hessian of shape (n, n).\n",
    "            \"\"\"\n",
    "            m, _ = x.shape\n",
    "            h_theta_x = np.reshape(h(theta, x), (-1, 1))\n",
    "            return 1 / m * np.dot(x.T, h_theta_x * (1 - h_theta_x) * x)\n",
    "\n",
    "        def next_theta(theta, x, y):\n",
    "            \"\"\"The next theta updated by Newton's Method.\n",
    "\n",
    "            :param theta: Shape (n,).\n",
    "            :return:      The updated theta of shape (n,).\n",
    "            \"\"\"\n",
    "            return theta - np.dot(np.linalg.inv(hessian(theta, x)), gradient(theta, x, y))\n",
    "\n",
    "        m, n = x.shape\n",
    "\n",
    "        # Initialize theta\n",
    "        if self.theta is None:\n",
    "            self.theta = np.zeros(n)\n",
    "\n",
    "        # Update theta using Newton's Method\n",
    "        old_theta = self.theta\n",
    "        new_theta = next_theta(self.theta, x, y)\n",
    "        while np.linalg.norm(new_theta - old_theta, 1) >= self.eps:\n",
    "            old_theta = new_theta\n",
    "            new_theta = next_theta(old_theta, x, y)\n",
    "\n",
    "        self.theta = new_theta\n",
    "\n",
    "    def predict(self, x):\n",
    "        \"\"\"Make a prediction given new inputs x.\n",
    "\n",
    "        :param x: Inputs of shape (m, n).\n",
    "        :return:  Outputs of shape (m,).\n",
    "        \"\"\"\n",
    "\n",
    "        return x @ self.theta >= 0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Use true t-labels for training:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "log_reg = LogisticRegression()\n",
    "log_reg.fit(x_train, t_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Plot decision boundary for training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Theta is:  [-0.9711418   2.73208784  1.07403478]\n",
      "The accuracy on training set is:  0.9632\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "util.plot(x_train, t_train, log_reg.theta)\n",
    "print(\"Theta is: \", log_reg.theta)\n",
    "print(\"The accuracy on training set is: \", np.mean(t_train == log_reg.predict(x_train)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Plot decision boundary for test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Theta is:  [-0.9711418   2.73208784  1.07403478]\n",
      "The accuracy on test set is:  0.9838709677419355\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "util.plot(x_test, t_test, log_reg.theta)\n",
    "print(\"Theta is: \", log_reg.theta)\n",
    "print(\"The accuracy on test set is: \", np.mean(t_test == log_reg.predict(x_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "#### (d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "Assume the t-labels are unavailable, we then switch to y-labels for training:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "log_reg = LogisticRegression()\n",
    "log_reg.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Plot the new decision boundary for test set. We expect it to perform poorly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEGCAYAAABsLkJ6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAlTklEQVR4nO3dfXRV5Z0v8O8vCS9BNOUlyigkkRa1yIsvQUGu7URsl+ILypplOzdi1u10UbBjYe50MbZZ6rI2d/XaezvacdDJtJ2yIHd1aIvaGatOS7nT1fIapQiIWOpNEK0loiJIJJD87h87B09O9j5n73323s9++X7WyjKcnOz9nJPj/u3n+T3P7xFVBRERZU+F6QYQEZEZDABERBnFAEBElFEMAEREGcUAQESUUVWmG+DFxIkTtaGhwXQziCiLXn8dOHwYOP984M/+zHRrPHnhhRfeVtXawscTFQAaGhrQ2dlpuhlElEU//jFwxx3AjBnA88+bbo0nItJt9ziHgIiI3Jg/3/rv1q1Af7/ZtgSEAYCIyI3zzwfq64H33wf27jXdmkAwABARuZXrBWzebLYdAWEAICJy65prrP/+9rdm2xEQBgAiIrfYAyAiyqgZM4CxY4HXXgPeest0a8rGAEBE5FZVFTB3rvV9CnoBDABERF6kKA/AAEBE5EUuD8AAQESUMXPnAiLAiy8Cvb2mW1MWBgAiIi/OOQeYORM4dQpIeGkaBgAiIq9SMh2UAYCIyKuUJIIZAIiIvMrvAaiabUsZGACIiLxqaAAmTQKOHAFefdV0a3xjACAi8kokFXkABgAiIj9SkAcwGgBE5GMi8hMReUVE9onIPJPtISJyLQULwkz3AB4F8JyqXgJgNoB9httDROTO5ZcDo0cDr7xi5QISyFgAEJFzAHwKwPcBQFX7VPU9U+0hIvJk5Ehgzhzr+y1bzLbFJ5M9gKkAegD8i4jsFJHvichZhU8SkaUi0ikinT09PdG3kojIScITwSYDQBWAKwA8rqqXA/gAwL2FT1LVdlVtVNXG2traqNtIROQs4YlgkwHgEIBDqrpt8N8/gRUQiIiSYd7gvJXt263aQAljLACo6lsAXheRiwcfWgDgZVPtISLybOJE4OKLgQ8/BHbuNN0az0zPAroHQIeIvATgMgD/w2xziIg8SnAewGgAUNXfDY7vz1LV21T1XZPtISLyLMF5ANM9ACLKiI7dHWh4pAEVD1ag4ZEGdOzuMN2kYCS4MBwDABGFrmN3B5b+21J0H+2GQtF9tBtL/21pOoLAxRcD48cDb74JdHebbo0nDABEFLrWja04cerEkMdOnDqB1o2thloUIJHEDgMxABBR6A4ePejp8cRJaCKYAYCIQldXU+fp8cRhD4CIyF7bgjaMGTFmyGNjRoxB24I2Qy0K2Jw5QFUVsHs38P77plvjGgMAEYWueWYz2m9pR31NPQSC+pp6tN/SjuaZzaabFozqauCKK4CBAWDbttLPj4kq0w0gomxontmcngu+nfnzrZIQmzcDn/mM6da4wh4AEVEQEpgHYAAgIgpCLgBs3Qr095tti0sMAEREQTj/fKChATh2DNizx3RrXGEAIKJYS1QJiYTtE8wAQESxlbgSEglbEMYAQESxlbgSEglLBDMAEFFsJa6ExIwZwNlnA11dVnG4mGMAIKLYSlwJicpKYO5c6/sEDAMxABBRbCWyhESC8gAMAEQUW4ksIZGgPIBognawaWxs1M7OTtPNICJy9v77wLhxQEWF9X11tekWQUReUNXGwsfZAyAiCtI55wAzZwKnTwM7dphuTVEMAEREQUvIgjDjAUBEKkVkp4j8u+m2EBEFIiGJYOMBAMAKAPtMN4KIwpOocg5ByCWCN2+29giIKaMBQEQmA7gJwPdMtoOIwuNUzuHuZ+4OLCg8/DCwadPQxzZtsh43or7eKg73zjvAq68aakRppnsAjwBYBcAxRIrIUhHpFJHOnp6eyBpGRMFwKufwROcTgdX4mTMHuOOOj4LApk3Wv+fMKbf1PokkYjqosQAgIjcDOKyqLxR7nqq2q2qjqjbW1tZG1DoiCopT2QbF0Cno5dT4aWoC1q+3Lvr332/9d/1663FjEpAHMNkDmA/gVhHpAvAjANeJyDqD7SGiEHgp21BOjZ+mJmD5cuChh4DZs4f/PPIhIfYAnKnq11R1sqo2APg8gF+p6p2m2kNE4bAr5yAQ2+eWU+Nn0ybg8ceB++6zpt/ffrvhIaHLL7cWge3fD7z9doQnds90DoCIUs6unMOyxmWB1vjJXeDXrwe+8Q3gqacAVSsIeB0SCiyhPGLERxFnyxaPvxyNWAQAVf2/qnqz6XYQUTiaZzaja2UXBh4YQNfKLqy+abWrGj9up4/u2DH0At/UZAWBxkZrSGj5cvf5gFxC+Utfsi78+b0Hz4Eg5nkA1gIioljKTR8tnEE0oXoCHr3x0ZIF4XIX7uXLraEhL0nhTZuA226zqjlUVVnBBPCRXH7mGeDmm4FrrwV+/WuXvxQ81gIiokSxmz4KAEd6j5ScMlo4JJSbIVQ4tOOkqQlYsQI4ccIKAvnH8zSzaN486787dgB9fR5+MRoMAEQUS8VmBJ04dQItT7Z4GhJav959bbb8hLKq92GkM8aPBz75SeDDD4GdOz3+cvgYAIjItzBX4JaaEdSv/Y49gVWrhl+sm5qsx0spvNsfOdKazPPd77rvQQwR4+mgDABE5El+YvZ/DzTg1taOUKZb2k0fLXTi1AmseHZFoHWGcr0HwHotTz5pDeV/7nPehpHOiHEimElgInLNLjE7qmIMRjzbjr+5vtlzstXpHK0bW3Hw6EGMrx6Pk/0ncbzvuOvfHzNiTCC7hj38sBXI8l/Lpk1WgHDTkzhj/37gkkuASZOsjeLFfg1EmJySwAwARORawyMN6D7aPezxGq3H0Qe7cN99VtLVL7sAM2bEGNtkcDH1NfXoWtnlvyFBUgVqa4EjR4DXXgMuvDDyJnAWEBGVzSkxexQHcd99VuLU1zj5IKfCcZVS6ek45ZSUCFyMC8MxABCRa06J2XNH1/mablnI6cLdr/3AqeHlJM4acZandhoT0zwAAwARuWaXmB1VMQbfuckq4eB1umUhxwv3QCVundIyZOXw2sVr8U+3/FOgJSVCE9MtIpkDICJP8pO0dTV1aFvQVnbCNf/Ydqt/AeuOf1njMqy+aXVk7QlMby9QU2OtKnv3Xev7CDEJTJmRiAsCOerY3YGWJ1usYZ8CAsHaxWuT+fecNw/YuhV4/nngs5+N9NRMAlMmOG0/mPo9aFOkeWYzBtR+k0CF+t40xrgYJoIZAChVnGaRJPaikVE14pzEjdUMHy9imAhmAKBUcbo4JPaikVGP3d4WyqYxRuV6AFu3WrmAGGAAoFRxujgk9qKRUc0zm7GscdmwIBDLGT5uTZoETJ0KHD8O7NljujUAGAAoZeymKSb6opFwbjZ0cXrO6ptWY+3itSU3jUmUmOUBqkw3gChIuYsDZwGZVzilM5eQBz76O5V6Tu4rNebPB9ats/IAX/6y6dZwGigRhcOpblB+nR43z0mVl14CZs8G6uuBrq7ITstpoEQUKafEe/fR7jNDPnYX/9xzgirvHCuXXgqccw7Q3Q288Ybp1jAAEFE4nBLvAjmzTqOYVK7jqKz8aJvIGEwHNRYARGSKiGwSkX0isldEVphqCxG55yaxC9gn5AVS8sJfqHAdR1A7jhkTo0SwyR7AaQB/q6qfBDAXwJdFZLrB9hBRCV5WWjfPbEb7Le1DZvF4vfjn5IaTvOw4FuZ2lWWJ0YIwYwFAVf+oqi8Ofn8MwD4AF5hqDxGV5maldX4PoXVjK9oWtGHggQF0rexCfU190eM71f2X9+tw//1D9+otZc6coaWpg9yusixXXQVUVFibxJ/wttFN0GKRAxCRBgCXA9hmuClEVESpldalegil9vnt137bdRy3jm3DQw8By5e7324yV5r6jjvgOXiE6uyzrZlAp0/7r5sdEOMBQETGAvgpgJWq+r7Nz5eKSKeIdPb09ETfQCI6o9RK62I9hFyV1mLbO+YWe+UPG62c2o7frG72teNYU5MVNLwGj9DFJA9gNACIyAhYF/8OVd1g9xxVbVfVRlVtrK2tjbaBRDREqZXWxaZ+5noGTnLHaZ7ZjK6VXRh4YAD/MrsL7fc0Y/16+NpxbNMmK2gEsV1loGKSBzA5C0gAfB/APlX9jql2EFFxhWP6LbNbHMszOPUQKqXS9s6/UiqLlnnYsWPosI2XHcdyY/5+g0eocj2AzZuBAfvS11Ew2QOYD2AJgOtE5HeDXwsNtodC4nbaIMWP3Zj+ml1rhiR28y/aTj0Eu81dAGBAB4Ycp/CzcsGNHcOGbZqagFWrPmqf02ernOARuro64IILrN3B9u831gyWgqBQ2W3xN2bEmOQX9coIP6Ua7HZka93YWvI4Xj8rif9sfe5zVkT6538GvvjFUE/FUhBkBDdoSTY/+yvkj+Hn7uzdVGn1+llJ/GcrBolgBgAKFTdoSZ78BVRB7a9gtyis/ZZ2AChZF8jrZygxn60YJIIZAChU3KAlefIXULUtaMOoiuF37gunLfSc1ynsGQAYkl9w4vUzlJjP1uzZwJgxwKuvAoamuDMAUKi4QUvy5C+g2v/jZox4th3njrLu3CdUT0CFVODxzsddlYOwk0vc3rnhzqJrAoDin5XEf7ZGjLBWBQPAli1GmsAAQKFy6vonIkmXAGHNsMpfQPU31zfjT/d2Ye3iteg93YvjfceHPb/Y2Ht+Gyc+PBFfePoLRdcDAHD1WUnFZ8twHoA7glHoUrerU0y42XHLr8IFVE1NQOuu4qt47cbeC9t4pPdIyXO73QzGbrZR4j5nhvMA7AEQJVRYs2CcFlCVSq7ajb2XKv1gZ+G0hSWrdnqpShprc+da/92xAzh5MvLTMwAQJVRYs2CcFlDViHNyNX/sPf/i7actP93982FVOwuHulY8uyLZU0Bzxo8Hpk+3Lv47d0Z+egYAooQKaxbMqlXDi6Y1NQGP3e5QyfPEBKycao29F5ZcHl893vP5D3/YPSQA2d3tOw0lJWYKaL7cMJCBPAADAFFCRT0Lxi7pum7xOvzqhrfRfk/zsJLLHbs7cKzv2LDjVKACE6onFDmT4M2JHw3leBlGSswU0HwGE8EMAEQBMFHvyMQsGLtVvk4ll1s3tqKvv2/YMcZVj8Pbq97GusXrIJDhJxHFf3/mo6Ect3f1iZoCmi8/ERxxaR7WAiJHqZhlEYHE16QpU27YZ/lya8ZQrgdQ8WCF4wKv+pp6HDx60HkBmAp+9ekBNDUB532rAYdPDp82OqF6AsaOHJv8z6cqcN551mKwAweAj3888FOwFhB5kppZFhFIfE2aMhQruew0HCOQkqt/x1XUYccO6zgnfma/GvnRGx/F3X1d2PipoVVJY7HvrxciQ8tDR4gBgGxl+aLmVeJr0pShWMnlhdPsq7uX2hh+VMUYnHquDcePW8HkZ23N+P5t9kNdsd331ytDeQAuBCNbWb6oeVVXU2e7sjWRCUmPcnX58zU1WV8Nj/zc1zHHjqrGtZ8BHvqGtRDNCi72iwnzy1YUDkEliqEFYewBkK3EF9qKUOJr0uQJMpnt5WYhPxl8pPcInupfitvu73C1jWNs9/314sorgZEjgT17gPfei+y0DABkK00XtbCloiYNgs37WL/jdHmRgn/J8GGhESewc1yrq20cY7vvrxejR1tBQBXYti2y0zIAkK20XNSiYjc9MmmCyvvkAonCZhvIU2Nw66RlQz5XTjmBg0cPltzGMdb7/nplIA9QNACIyDkiMmxOkojMCq9JFBdpuKiFJY37HAeV93FcuDVQia/PaMfTX1qNtgVtqKupw8GjB1EplbbHyQ035u8BXCjW+/56ZSAP4BgAROQOAK8A+KmI7BWR/Lz6D8NuGH0kjRebJEvrFNmg8j6OAUMG0Pb55mHvn92G8W6HG53KVjgFjFjL9QC2bgVOn47klMV6AF8HcKWqXgbgvwFYKyKLB39ms3yPwpDWi02SpXWKbFB5H6eAUXGsDps2OfcQKqUy28ON551nLQL74APgpZciOWWxAFCpqn8EAFXdDqAJQKuIfAUoMZGXApPWi02SpXWKbFB5H6dAcu+ctqJlpQd0gMONEQ8DFQsAx/LH/weDwZ8DWATg0iBOLiI3iMh+ETkgIvcGccy0iePFJutDUmmeIhtE3icXSD4mQwNJ2+ebi5aVTsP7V7aIE8HFAsByABUiMj33gKoeA3ADgC+We2IRqQTwjwBuBDAdwF/mn4sscbvYpGVIqpwglsYpskEH9eaZzXj3/qEbwDc80oAFv65A5ejjGFExYsjzk/7+BSYuPQBV3aWqvwewXkT+TizVAL4D4O4Azn0VgAOq+pqq9gH4EazeBeWJ28UmyUNSuYucPChYsmGJ7yCWtimyYQf1wuMf6T0CEWuD+TS8f4GaPh2oqQEOHgQOHQr9dG7WAVwNYAqAzQB2AHgTwPwAzn0BgNfz/n1o8LEhRGSpiHSKSGdPT08Ap02WuF1s4jgk5Ub+RQgYXo/GKYg53RmnaYps2EHd7vh9/X0YO3JsKt6/QFVUAPPmWd9H0AtwUwvoFIBeANUARgP4f6o6EMC57WYSDUsuq2o7gHbAKgcdwHkTJ06bqo+vHm+7G5OfnZ+i5GZTkcIgFuam63ESdlBP6k2DMddcAzz3nJUHuOOOUE/lpgewA1YAmAPgv8Aaq/9JAOc+BKtnkTMZVu+CUiYOSWM3F5vCvEqSh7u8CDvPFLc8VuxFmAdwEwD+SlXvV9VTqvqWqi4C8HQA594BYJqIXCgiIwF8HsDPAjguheid3neKPl54sb/7mbuNJo1z7SlVgtgur5KVO1enPNPCaQs9B267YB+3PFbsXXUVUFlpbRL/wQehnqpkAFDVYVtwqerack+sqqcB/DWA5wHsA7BeVfeWe1wKV7G7Obtk4hOdTxi7iy4c9y+Uq0DplFfJyp2rXZ6pZXYL1uxa4ylwOyWTAcQqjxV7Y8cCs2cD/f3A9u2hnopbQpInxbY/bN3Y6nixLSQQDDwQRCrJWcMjDY7tqa+pL7mFYJa3enR67+pr6s9M63T7O5VSiTW3r0n9exaor3wF+Id/AL75TaC1/JslbglJgSg2K8nL0EgUd9FO7RGIq5kncZuBFSU/w19OwbZf+7FkwxLc/UwQs8czIqIFYdwRjDxzmpXktDNWYb33qMZ/g9ipK04zsKLk9b3r2N1hX9d/kELxROcTmF83P5Pvp2e5RPCWLcDAgDU9NATsASRcHGbY5Dgl+5Y1LjNyF83ko39e37vWja0lE+0KTd0MqtBMmQJMnmztDrZvX2inYQ8gweI2Tz13ztaNrTh49CDqaupKjrNnqT1J4vW9czv8l7YZVKGaPx/413+1poNeGkj5tWGYBE4wP4m6nI7dHbwwUmAmPjzRdoFgITefTRr03e8CK1YALS3AD39Y1qGcksDsASSY33nqces5ULJ17O7Asb5jJZ/H4TePIlgQxhxABMIap/c7Tz0rK1y9ilM+JUlaN7air79v2ONnjTgrkzOoAjN7NjBmDPD73wOHD4dyCgaAkIVZadFvkjMrK1y9sPs7ceqiO06fmxOnTqBrZRfWLrbWjS7ZsISB1YuqKuDqq63vQ+oFMACELMy7bb/z1LOywtULu79TbuoiL1jFeV0dnsT9I4wJeRiIASBkYd9t+ylLHMX0yCiHU4I4l9Pfg1MXSyv2eeJwY5lCXhDGABCyON5th73CNcq7vqDOVezvkeWhMTf8rA7ne+pSbm+Azk7g5MnAD89poCHLYj2ZcqanmjpXx+4OLNmwxHYxE6cu+hflZyG1ZswA9u61egG5HoFHrAVkSBbryUR51xfUuZpnNmNZ47IzFUJzOHWxPFyNHYAQ8wAMABFI0/aBbkQ57BXkuVbftBprF68NJFhzSqklizdAgQsxD8AhIApclMNeXs4V1ernLA77UYgOHACmTQPOPRd46y1A7HbTLY5DQBSZKO/63J4rysR0VDNf2MvIiI9/3Lr4Hz4M/OEPgR6aPQDKhCiTkfKg8x2aPhDM/2/sZZSWqnpXt98OPPUUsGYNcNddnn+dPQDKnPw7ZKfNSsJITFdKpafH/eD8+uJStwAtlwgOOA/AAECpVHgBcBJGYrpf+z097gfn1xeXugAZUiKYAYBSye4CUCis6Yj1NfWeHvcj6JlWacsnpC5AXnklMHKktR7gvfcCOywDAMVOmKUdAISemI5i7nuQ50jdcAniuQK/LKNGAY2DQ/hbtgR2WCMBQES+LSKviMhLIvKkiHzMRDuoOBN3hWGXdqivqY9kPUZ1VfWZ7ydUTwg82AQ50yp1wyVI6QK0EBaEmeoB/ALADFWdBeBVAF8z1A5yYOquMKiLkakLQO59y98dq/d0byjnCmqBYeqGS5DSBWgh5AGMTwMVkdsB/IWqlvzLcBpodEzVcKl4sMI2aSsQDDww4OlYQU0D9HKcJNa+SWKbM+nwYeC886xNYo4etfYLcCnO00C/AOBZpx+KyFIR6RSRzp6engiblQxhDdOYuisMcuw2iDtkrz2hJN5Np3K4JI3OPRf4xCeAEyeAXbsCOWRoAUBEfikie2y+FuU9pxXAaQCOVy1VbVfVRlVtrK2tDau5iRTmMI2pJFrcLkZeh6SSmHxM5XBJWgWcBwgtAKjq9ao6w+braQAQkRYANwNoVtPjUAkVZvLO1IU4bhcjr3f0cQtgbmWtYGFiBbwgzP0gUoBE5AYAfwfg06pafLI2OQpzuCF3ATCxlL55ZnNsLkB1NXW24+NOd/Qm3zfKgIATwUaSwCJyAMAoALmpEltVdVmp32MSeKi0Je/iWLvFrubOyMqROHvk2Xin953YtJMyYmAAmDDBWgx28CAwZYqrX4tVElhVP6GqU1T1ssGvkhd/Gi6pww123OQzTKxLaJ7ZjJbZLWfq+FRIBU73n8aR3iOpWTRFCVJR8dE2kQH0AuIwC4h8itt4eTlK5TOCSnh7DSIduzuwZteaM3V8BnQAAxg6HTXpi6YoYQJMBBtfB+AFh4CSwc9QTqn5/0EMd/kpoex0Xqd2EoVu0ybguuuAK64AXnjB1a/EagiI0qvUnbrTHXip6ZNBJLz9zJpye/zx1eOHPZa2AmsUE1ddBVRWWmsBjh8v61AMABSoYhfZYsGhVD4jiPn1foKI2+Mf6zs2LF+RtgJrFBNnnQVcdhnQ3w9s317WoRgAKFDFLrLFgkOpfEYQCW8/QcTuvHb6+vuG9CTSWGCNYiSgPAADAAWq2EW21B14scVIQSS8/QQRu/M6yX99SSwJQQkS0IIwBgAKVLGLbLnDOOWuVvUbRArP6xQE8l9HEktCUILkFoRt2WKtDfCJAYACVewiG4d1C36CSGEyd+G0hSVfRxxeK6XY5MlAXZ1VFfTll30fxkgpCEo3p1IOcS+TYDd9FcCQqaPdR7uxZtcatMxuwc9//3PH1xH310opcM011mrg3/4WmDHD1yG4DoAIzmsEqquqh2zukpPUchuUIo89BtxzD3DXXcCaNUWfynUAlFhRzKd3mrVjd/EHmMylGAigMBwDAMWan/n0fgKG1wt6kMlcLhgjX2bNstYE/OEPwJ/+5OsQDADkm8k7c6f59H4XYDld0CdUTwg1mcsFY+RbVRVw9dXW9z7XAzAAkC9RXbi8zqf3uwDLadbOozc+GmrBPRMLxtjjSJEyF4RxFhD5UmpVb1C8bsjidwFWqVk7Yc3eiXrBWGGyOxe4gfBeI4WozAVh7AGQL1FduLzOpy9nAZaJbRGjXjDGEhUpM3cuIGJVBf3wQ8+/zgCQcKa682FeuPJfU+vGVrTMbnE9BJO0BVhRt5clKlKmpsZaA9DX57o0dD4GgAQzmUAM68Jl95rW7FqDtgVtru7Mk7ZJTtTtZYmKFCpjOigXgiWY6T2Bw9jD1/RrirMg3m8/m+JQzK1day0GW7QIeOop26c4LQRjEjjBTHfnnUo+lMP0a4qroJK3LFGRQrkewObNgKqVE3CJASDBvM6QSYI0vqYgBDnrKozATQZNnQqcd561GOzAAWDaNNe/yhxAgiUt4elGGl9TENgzIkcivvMARgOAiHxVRFREJppsR1IlLeHpRhpfUxCYvKWifC4IM5YEFpEpAL4H4BIAV6rq26V+h0lgyqpykrdhJOspZrZuBebNA6ZPB/buHfbjOFYD/XsAqwAkZxoSkSF+e0asNZQRl18OjBplbQ7z7ruuf81ID0BEbgWwQFVXiEgXgEanHoCILAWwFADq6uqu7O4eniAkKiWrd8GcVpsh114L/OY3wDPPAAsXDvlR5D0AEfmliOyx+VoEoBXA/W6Oo6rtqtqoqo21tbVhNZdSLMt3wUweZ4iPRHBoAUBVr1fVGYVfAF4DcCGAXYN3/5MBvCgik8JqC2VbluvfMHmcIT4SwZHnAFR1t6qeq6oNqtoA4BCAK1T1rajbQtmQ5bvguEyrZQnqCMybZ/132zbg1ClXv8J1AJR6Wb4LjsO02iwPwUWqtha46CKgtxfYtcvVrxgPAIM9gZJTQIn8CuMuOEl3tCbKXOfL8hBc5DzmAYwHAKKwBX0XbOqONklBJ1+Wh+Ai5zEPwGqgRB6ZmFqZ5CqenIoaoZdfBi69FLjgAuD1188UhovjQjCiRIryjjZ313/nhjsTO4wSl0R0JlxyCTBuHPDGG1YAKIEBgMijqJLK+UNNTpIwjBKHRHRmVFR4ygMwABCA5I4vm2B3RwsAx/uOB/q+2SVPCyVlJpPpRHSm5O8PUAL3A6DANhvJitx7suLZFTjSe+TM40d6jwT6vpW6u+cwCtnKJYLZAyA3OE3Pu+aZzRg7cuywx4N834rd3XMYhRzNmQNUVVlrAY4dK/pUBgDiND2fwn7fnJKn6xav4zAKORszxqoOOjAAbN9e9KkMAJTplbLlCPt9Y/KUfHOZCGYAIE7T8ymK943JU/LF5YIwBgDinaZPfN8otnI9gC1bgP5+x6dxJTARURo1NADd3cBLL0FmzeJKYCKizHAxHZQBgIgojVwsCGMAICJKI/YAiIgyasYMYOxY4LXXHJ/CAEBElEZVVcDcuUWfwgBARJRWuTyAAwYAIqK0WrAAWLTI8cesBkpElFaf+pT1NbgzWCH2AIiIMspYABCRe0Rkv4jsFZGHTbWDiCirjAwBiUgTgEUAZqnqSRE510Q7iIiyzFQPYDmAb6nqSQBQ1cOG2kFElFmmAsBFAK4VkW0i8p8iMsfpiSKyVEQ6RaSzp6cnwiYSEaVbaENAIvJLAJNsftQ6eN5xAOYCmANgvYhMVZvSpKraDqAdsKqBhtVeIqKsCS0AqOr1Tj8TkeUANgxe8LeLyACAiQB4i09EFBFTQ0BPAbgOAETkIgAjAbxtqC1ERJlkaiHYDwD8QET2AOgD0GI3/ENEROExEgBUtQ/AnSbOTUREFq4EJiLKKAYAIqKMYgAgIsooBgAiooxiACAiyigGACKijGIAICLKKAYAIqKMkiQtwBWRHgDdEZ92IrJTpoKvNZ34WtPJy2utV9XawgcTFQBMEJFOVW003Y4o8LWmE19rOgXxWjkERESUUQwAREQZxQBQWrvpBkSIrzWd+FrTqezXyhwAEVFGsQdARJRRDABERBnFAOCSiNwjIvtFZK+IPGy6PWETka+KiIrIRNNtCYuIfFtEXhGRl0TkSRH5mOk2BUlEbhj8zB4QkXtNtycsIjJFRDaJyL7B/z9XmG5T2ESkUkR2isi/l3McBgAXRKQJwCIAs1T1UgD/y3CTQiUiUwB8BsBB020J2S8AzFDVWQBeBfA1w+0JjIhUAvhHADcCmA7gL0VkutlWheY0gL9V1U8CmAvgyyl+rTkrAOwr9yAMAO4sB/AtVT0JAKp62HB7wvb3AFYBSPUMAVX9D1U9PfjPrQAmm2xPwK4CcEBVXxvcgvVHsG5iUkdV/6iqLw5+fwzWhfECs60Kj4hMBnATgO+VeywGAHcuAnCtiGwTkf8UkTmmGxQWEbkVwBuqust0WyL2BQDPmm5EgC4A8Hrevw8hxRfFHBFpAHA5gG2GmxKmR2DdoA2UeyAjm8LHkYj8EsAkmx+1wnqfxsHqXs4BsF5EpmpC59CWeK1fB/DZaFsUnmKvVVWfHnxOK6xhhI4o2xYysXkskZ9Xt0RkLICfAlipqu+bbk8YRORmAIdV9QUR+fNyj8cAMEhVr3f6mYgsB7Bh8IK/XUQGYBVi6omqfUFyeq0iMhPAhQB2iQhgDYm8KCJXqepbETYxMMX+rgAgIi0AbgawIKkB3cEhAFPy/j0ZwJuG2hI6ERkB6+LfoaobTLcnRPMB3CoiCwGMBnCOiKxT1Tv9HIwLwVwQkWUAzlfV+0XkIgAbAdSl7IIxjIh0AWhU1VRWVxSRGwB8B8CnVTWRwdyJiFTBSmwvAPAGgB0A/quq7jXasBCIdbeyBsA7qrrScHMiM9gD+Kqq3uz3GMwBuPMDAFNFZA+sZFpL2i/+GfEYgLMB/EJEficiT5huUFAGk9t/DeB5WEnR9Wm8+A+aD2AJgOsG/46/G7xDphLYAyAiyij2AIiIMooBgIgooxgAiIgyigGAiCijGACIiDKKAYAoICLynIi8V26FRqKoMAAQBefbsOajEyUCAwCRRyIyZ3APgdEictZgDfoZqroRwDHT7SNyi7WAiDxS1R0i8jMA3wRQDWCdqu4x3CwizxgAiPz5Bqz6Oh8C+IrhthD5wiEgIn/GAxgLq5bQaMNtIfKFAYDIn3YA98HaQ+B/Gm4LkS8cAiLySETuAnBaVf/P4N67m0XkOgAPArgEwFgROQTgr1T1eZNtJSqG1UCJiDKKQ0BERBnFAEBElFEMAEREGcUAQESUUQwAREQZxQBARJRRDABERBn1/wHiaaSC6ziBjQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "util.plot(x_test, y_test, log_reg.theta)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "#### (e)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "According to part (b), we know that:\n",
    "\n",
    "$$\n",
    "p(t^{(i)} = 1 \\ \\vert \\ x^{(i)}) = \\frac{1}{\\alpha} \\ p(y^{(i)} = 1 \\ \\vert \\ x^{(i)})\n",
    "$$,\n",
    "\n",
    "meaning if we can find $\\alpha$, we can estimate $p(t^{(i)} = 1 \\ \\vert \\ x^{(i)})$ with y-labeled data.\n",
    "\n",
    "It's easy to prove that $h(x^{(i)}) = \\alpha$ when $y^{(i)} = 1$, and $h(x^{(i)}) = 0$ when $y^{(i)} = 0$.\n",
    "Hence:\n",
    "\n",
    "$$\n",
    "\\alpha = \\mathbb E [h(x^{(i)}) \\ \\vert \\ y^{(i)} = 1] \\approx \\frac{1}{\\vert V_+ \\vert} \\sum_{x^{(i)} \\in V_+} h(x^{(i)})\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Reuse function `h` in the logistic regression model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "def h(theta, x):\n",
    "    return 1 / (1 + np.exp(-np.dot(x, theta)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Estimate $\\alpha$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "v_plus = x_valid[y_valid == 1]\n",
    "alpha = h(log_reg.theta, v_plus).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Rescale the classifier's predictions using $\\alpha$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "def predict(theta, x):\n",
    "    return h(theta, x) / alpha >= 0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "To plot the decision boundary found by solving $\\frac{1}{\\alpha} \\frac{1}{1 + \\exp(- \\theta^T x)} = \\frac{1}{2}$,\n",
    "we can equivalently transform the equation to the form of $\\theta'^T x = 0$ and solve for $\\theta'$. By simplifying\n",
    "the equation, we obtain $\\theta^T x + \\log (\\frac{2}{\\alpha} - 1) = 0$. The left-hand side is in fact adding $\\log (\\frac{2}{\\alpha} - 1)$\n",
    "to $\\theta_0$. Hence, $\\theta' = \\theta + \\log (\\frac{2}{\\alpha} - 1)[1, 0, 0]^T$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [],
   "source": [
    "theta_prime = log_reg.theta + np.log(2 / alpha - 1) * np.array([1, 0, 0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Plot decision boundary for test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% code\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Theta_prime is:  [-0.55096984  0.78596651  0.09282768]\n",
      "The accuracy on test set is:  0.9516129032258065\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "util.plot(x_test, y_test, theta_prime)\n",
    "print(\"Theta_prime is: \", theta_prime)\n",
    "print(\"The accuracy on test set is: \", np.mean(predict(log_reg.theta, x_test) == t_test))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "cs229",
   "language": "python",
   "name": "cs229"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
